/*
* Copyright (c) 2011-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.openinfinity.core.spring;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.util.Assert;
/**
* Property configurator class which enables property reading from the shared database.
*
* @author Ilkka Leinonen
* @version 1.0.2
* @since 1.0.0
*/
public class JdbcPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
/**
* Query sequel when executing queries.
*/
private static final String PROPERTIES_QUERY_SQL = "SELECT KEY_COLUMN, VALUE_COLUMN FROM SHARED_PROPERTIES";
/**
* Shared properties instance.
*/
private Properties properties;
/**
* JDBC template for accessing shared database.
*/
private JdbcTemplate jdbcTemplate;
/**
* Default constructor for the class.
*/
public JdbcPropertyPlaceholderConfigurer() {}
/**
* Public constructor for the class.
*
* @param dataSource Represents the shared database data source.
*/
public JdbcPropertyPlaceholderConfigurer(DataSource dataSource) {
super();
Assert.notNull(dataSource, "Please define data source for reading properties from the shared data repository.");
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
/**
* Reads properties from the shared data source.
*
* @return Properties Returns properties fetched from the shared database.
*/
public Properties readPropertiesFromDataSource() {
properties = new Properties();
jdbcTemplate.query(PROPERTIES_QUERY_SQL, new RowMapper<Properties>(){
@Override
public Properties mapRow(ResultSet resultSet, int rowNum) throws SQLException {
String key = resultSet.getString("KEY_COLUMN");
String value = resultSet.getString("VALUE_COLUMN");
properties.setProperty(key, value);
return properties;
}
});
return properties;
}
/**
* Overrides the loadProperties method and adds properties found from the shared database and calls actual super classes method loadProperties with populated properties.
*/
@Override
protected void loadProperties(Properties props) throws IOException {
properties = readPropertiesFromDataSource();
if (properties.size() > 0) {
props.putAll(properties);
}
super.loadProperties(props);
}
}